package jmind.core.support.locks;

import jmind.core.redis.Redis;
import redis.clients.jedis.params.SetParams;

/**
 * description:
 *  * 简单redis分布式锁的实现
 *  * Redlock 算法着眼于满足分布式锁的三个要素：
 *
 *  安全性：保证互斥，任何时间至多只有一个客户端可以持有锁
 *  免死锁：即使当前持有锁的客户端崩溃或者从集群中被分开了，其它客户端最终总是能够获得锁。
 *  容错性：只要大部分的 Redis 节点在线，那么客户端就能够获取和释放锁。
 *  * 如果想要强大的分布式锁请使用 RedissonLock
 *  http://blog.csdn.net/csujiangyu/article/details/51005342 RedissonManager
 * https://yuque.antfin-inc.com/tair-userdoc/cloud-redis/yugwle
 * https://yuque.antfin-inc.com/tair-userdoc/cloud-redis/distlock
 * @author weibo.xie
 * @date : create in 5:17 下午 2021/6/23
 */
public class RedisDistributedLock implements DistributedLock {


    public RedisDistributedLock(Redis redis){
        this.redis=redis;
    }

    private final Redis redis;
    @Override
    public boolean tryLock(String key, int expire) {
        String result = redis.set(key,getRequestId(),SetParams.setParams().nx().ex(expire));
        return "OK".equals(result);
    }



    @Override
    public boolean unlock(String key) {
        String requestId = redis.get(key);
        if(requestId==null){
            return true;
        }
        if(requestId.equals(getRequestId())){
              redis.del(key);
              return true;
        }
        return false;
    }
}